package algo3.algothief.controlador;

import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import algo3.algothief.excepcion.CasoNoIniciadoException;
import algo3.algothief.modelo.DescripcionDeLadron;
import algo3.algothief.modelo.Juego;
import algo3.algothief.vista.VistaJuego;


public class ControladorEmisionDeOrden {

	private Juego juego;
	
	private VistaJuego vistaDelJuego;
	
	private ControladorDescripcion controladorDeLaDescripcion;
	
	private HashMap<String, String> opcionesParaOrdenarUnArresto;
	
//---------------------------------------------------------------------------------------------------------
	
	public ControladorEmisionDeOrden(Juego juegoActual, VistaJuego vista) {
		this.juego = juegoActual;
		
		this.vistaDelJuego = vista;
		
		this.controladorDeLaDescripcion = new ControladorDescripcion(juegoActual, vista);
		
		this.opcionesParaOrdenarUnArresto = this.crearOpcionesParaOrdenarUnArresto();
	}

//---------------------------------------------------------------------------------------------------------
	
	private HashMap<String, String> crearOpcionesParaOrdenarUnArresto() {
		HashMap<String, String> opciones = new HashMap<String, String>();
	
		opciones.put(Integer.toString(1), "Emitir una orden con la descripcion del sospechoso actual");
		opciones.put(Integer.toString(2), "Modificar la descripcion del sospechoso actual");
			
		return opciones;
	}
	
	private ArrayList<String> crearDescripcionesParaMostrar(ArrayList<DescripcionDeLadron> descripcionesDeLosSospechosos) {
		ArrayList<String> descripcionesMostrables = new ArrayList<String>();
		
		for (DescripcionDeLadron descripcionDelSospechoso : descripcionesDeLosSospechosos) {
			String nombreDelSospechoso = descripcionDelSospechoso.verNombre();
			descripcionesMostrables.add(nombreDelSospechoso);
		}
		
		return descripcionesMostrables;
	}
	
	private String procesarAccionAElegir(BufferedReader entradaDeTeclado) throws IOException{
		String entrada = entradaDeTeclado.readLine();
		
		String opcionParaVolverAlMenuPrincipal = Integer.toString(0);
		
		while ( (!opcionesParaOrdenarUnArresto.containsKey(entrada)) && (!opcionParaVolverAlMenuPrincipal.matches(entrada)) ) {
			VistaJuego.graficarMensajeDeOpcionElegidaIncorrecta(entradaDeTeclado);
			
			vistaDelJuego.graficarMenuDeEmisionDeOrdenDeArresto(opcionesParaOrdenarUnArresto);
			entrada = entradaDeTeclado.readLine();
		}
			
		return opcionesParaOrdenarUnArresto.get(entrada);
	}
	
//---------------------------------------------------------------------------------------------------------

	public void procesarEntradasParaOrdenarUnArresto(BufferedReader entradaDeTeclado) throws ParserConfigurationException, SAXException, IOException, CasoNoIniciadoException {
		vistaDelJuego.graficarMenuDePosiblesLugaresParaVisitar(opcionesParaOrdenarUnArresto);
		String eleccion = this.procesarAccionAElegir(entradaDeTeclado);
		
		boolean seEligioEmitirLaOrdenDeArresto = false;
		while ((eleccion != null) && (!seEligioEmitirLaOrdenDeArresto)) {
			if (eleccion.matches("Emitir una orden con la descripcion del sospechoso actual")) {
				juego.emitirOrdenDeArresto();
				
				ArrayList<DescripcionDeLadron> descripcionesDeLosSospechosos = juego.verSospechososQueConcuerdanConLaDescripcionHechaPorElJugador();
				ArrayList<String> descripcionesMostrables = this.crearDescripcionesParaMostrar(descripcionesDeLosSospechosos);
				
				vistaDelJuego.graficarResultadoDeLaEmisionDeLaOrdenDeArresto(descripcionesMostrables, entradaDeTeclado);
				seEligioEmitirLaOrdenDeArresto = true;
			}
		
			else if(eleccion.matches("Modificar la descripcion del sospechoso actual")) {
				controladorDeLaDescripcion.procesarEntradasParaModificarLaDescripcionDelSospechoso(entradaDeTeclado);
				
				vistaDelJuego.graficarMenuDePosiblesLugaresParaVisitar(opcionesParaOrdenarUnArresto);
				eleccion = this.procesarAccionAElegir(entradaDeTeclado);
			}
		}
	}
}
